- Python 3.13
- MongoDB(Docker)
- Redis(Docker)
推荐将当前应用部署在docker外面,若部署到docker里面需要自行处理宿主机docker启动权限、数据库连接问题。
将所有的FIRE多语言image load到宿主机的image list里面
你收集的FIRE多语言镜像应为.tar.gz格式
gunzip -c docker load -i <fire_image>.tar.gz | docker load获得所有已加载FIRE image列表
docker image list将所有的docker image信息写入run.py。格式为lang: image_name:tag。请确保你在这里填入的lang信息和前端传入后端的lang信息保持一致。
detectors = {
"cpp": "FIRE/FIRE:cpp",
}创建Python venv环境并安装requirements.txt
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtImportant
请确保运行该后端的程序的用户具备docker的权限
安装docker-compose
REF: https://docs.docker.com/compose/install/linux/
启动MongoDB和Redis
docker compose up -d如果接口被占用请更换docker-compose.yml中port字段冒号前面的端口,换一个没人用的端口。不要改冒号后面的端口。更改完端口之后搜索全文,将整个项目中原有使用端口改成新的修改后的端口。
留意输出,确保创建的网络名称和celery_task/detector_backends第10行的名称相同
network = "code-clone-backend_network"如果使用其他方法启动mongodb和redis,确保如下几个地方的url填写正确
run.py11行celery_task/celery.py3-4行celery_task/tasks8行
注意!当前方法启动的mongodb数据库和redis数据库均没有设置密码,仅限开发过程使用。
注意!当前方法启动的两个数据库的数据都没有持久化,仅供开发过程使用,正式上线请修改compose文件将两个数据库持久化。
注意这里只启动1个celery worker,不然服务器可能会扛不住。
celery -A celery_task worker --pool=solo --loglevel INFOcelery服务应该是不太能在后台跑的,这是前台服务,用tmux或者screen跑个后台就可以。
Flask自带WSGI不太适用于生产环境,转到生产环境的时候请使用其他WSGI
启动flask
python3 run.pyflask也是前台服务,轻为它开个终端保活。
服务将在5000端口上开启,若占用请更改port。
celery和flask直接Ctrl+C停止就行,celery停止需要一点时间所以请有耐心。
docker停止通过docker compose down即可
异常停止时,检查container list是否有带code_detector_开头的名称容器。如果有请你将其停止,该容器会自动移除。
docker container list -a | grep code_detectorMongoDB存储结构可参考database.py文件中的sample_structure。关于status字段的信息参考utils.py文件。如有需要请自行增加STATUS
如果有需要查阅Exception信息或者新增Exception,请在utils.py内更改或增加
请求示例参见test.http文档
用于发起代码检测任务,支持上传文件类型(Git仓库或文件)。
POST/api/v1/code-detection/start- Accept: application/json
- Content-Type: application/json
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| repositoryUrl | string | Yes | Git存储库 |
| language | string | Yes | 编程语言(见下方注释) |
| branch | string | Yes | Git存储库分支/Tag |
其中,language的取值为:
- C/C++语言:
cpp - 待补充
{
"repositoryUrl": "https://github.com/openmvg/openmvg",
"language": "cpp",
"branch": "v1.6"
}- 状态码:
202
| 参数名 | 类型 | 描述 |
|---|---|---|
| taskId | string | 任务Id(唯一) |
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f"
}用于发起代码检测任务,支持上传文件类型(Git仓库或文件)。
POST/api/v1/code-detection/status- Accept: application/json
- Content-Type: application/json
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| taskId | string | Yes | 任务Id |
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f"
}- 状态码: 状态为
Created,Pending时为202,为Finished时为200,为Error,Unknown时为500
| 参数名 | 类型 | 描述 |
|---|---|---|
| taskId | string | 任务Id(唯一) |
| status | string | 状态信息 |
| createAt | string | 任务创建时间 |
| startTime | string/None | 任务开始时间(未开始则为None) |
| endTime | string/None | 任务结束时间(未开始或出现错误为None) |
| errorMessage | string | 错误信息(无错误则为空字符串) |
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f",
"status": "Pending",
"createAt": "2025-04-17 13:06:11",
"startTime": "2025-04-17 13:06:11",
"endTime": null,
"errorMessage": ""
}获取检测任务的统计结果,包括成功、失败的代码检测数量等。
请在status为Finished的情况下调用这个结果,否则将会报出“检测未完成或出错”的错误。
POST/api/v1/code-detection/results/statistics- Accept: application/json
- Content-Type: application/json
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| taskId | string | Yes | 任务Id |
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f"
}- 状态码:
200
| 参数名 | 类型 | 描述 |
|---|---|---|
| taskId | string | 任务Id(唯一) |
| vulCnt | integer | 检测出的漏洞总数 |
| vulFuncCnt | integer | 含有漏洞的函数总数 |
| vulFileCnt | integer | 含有漏洞的文件总数 |
一个检出的漏洞对视为一个漏洞,若一个函数和多个cve对应,那么计多个vulCnt
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f",
"vulCnt": 42,
"vulFuncCnt": 29,
"vulFileCnt": 12
}分页查询指定任务的检测结果,支持按检测状态筛选。
请在status为Finished的情况下调用这个结果,否则将会报出“检测未完成或出错”的错误。
POST/api/v1/code-detection/results/page- Accept: application/json
- Content-Type: application/json
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| taskId | string | Yes | 任务Id |
| pageNumber | integer | Yes | 页码,从1开始 |
| pageSize | integer | Yes | 每页数量 |
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f",
"pageNumber": 1,
"pageSize": 5
}- 状态码:
200
| 参数名 | 类型 | 描述 |
|---|---|---|
| taskId | string | 任务Id(唯一) |
| pageNumber | integer | 页号数 |
| pageSize | integer | 单页大小 |
| totalPage | integer | 总页数 |
| totalCount | integer | 总记录数 |
| results | list[object] | 检测结果 |
results 检测结果的一条结果的结构如下:
| 参数名 | 类型 | 描述 |
|---|---|---|
| fileName | string | 含漏洞的文件名 |
| funcName | string | 含漏洞的函数名 |
| cve | string | cve号 |
results 字段已删除部分结果
{
"taskId": "a39b3e25-97d7-41c9-b456-9c35c945d13f",
"pageNumber": 1,
"pageSize": 5,
"totalPages": 9,
"totalCount": 42,
"results": [
{
"fileName": "src/third_party/png/pngset.c",
"funcName": "png_set_IHDR",
"cve": "CVE-2015-0973"
}
]
}- 状态码:
400,404,500
| 参数名 | 类型 | 描述 |
|---|---|---|
| errorMessage | string | 错误信息 |
| taskId | string | 引发错误的taskId(optional) |
{
"errorMessage": "task_id not found",
"taskId": "929275e4-3266-4947-a06d-83aec162bae1"
}